/**
 * 绘制点图片
 * @param {string} options.image 图片路径或base64
 * @param {Number} options.height 图片高度
 * @param {Number} options.width 图片宽度
 * @param {Number} options.rotation 逆时针旋转角度 笛卡尔坐标下z轴
 * @param {Boolean} options.sizeInMeters 大小是否以米为单位
 * @param {string} options.verticalOrigin 相对于坐标的垂直位置 TOP CENTER BOTTOM
 * @param {string} options.horizontalOrigin 相对于坐标的水平位置 LEFT CENTER RIGHT
 * @param {Array} options.pixelOffset 该属性指定标签在屏幕空间中距此标签原点的像素偏移量 笛卡尔坐标[ x, y, z ]
 * @param {Number} options.scale 应用于图像的缩放比例
 * @param {Boolean} options.show 是否显示
 * @param {object} options.data 临时数据存放
 * 
 * @returns {Array} rgba颜色数组
 */
function DrawCesiumImg (options) {
    let VOrigin = options.verticalOrigin || 'BOTTOM'
    let HOrigin = options.horizontalOrigin || 'CENTER'
    let pixelOffset = options.pixelOffset || [ 0, 0, 0 ]
    // let color = options.color || [ 0, 0, 0, 1 ]
    // this.colorObj = new Cesium.Color(color[0], color[1], color[2], color[3])
    var pin = options.earth._viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(options.position[0], options.position[1], options.position[2] ? 0 : options.position[2]),
        billboard: {
            // 图像地址，URI或Canvas的属性
            image: options.image,
            // 设置颜色和透明度
            // color: this.colorObj,
            // 高度（以像素为单位）
            height: options.height || 30,
            // 宽度（以像素为单位）
            width: options.width || 30,
            // 逆时针旋转
            rotation: options.rotation || 0,
            // 大小是否以米为单位
            sizeInMeters: options.rotation === undefined ? false : options.rotation,
            // 相对于坐标的垂直位置
            verticalOrigin: Cesium.VerticalOrigin[ VOrigin ],
            // 相对于坐标的水平位置
            horizontalOrigin: Cesium.HorizontalOrigin[ HOrigin ],
            // 该属性指定标签在屏幕空间中距此标签原点的像素偏移量
            pixelOffset: new Cesium.Cartesian3(pixelOffset[0], pixelOffset[1], pixelOffset[2]),
            // 应用于图像的统一比例。比例大于会1.0放大标签，而比例小于会1.0缩小标签。
            scale: options.scale === undefined ? 1 : options.scale,
            // 显示在距相机的距离处的属性，多少区间内是可以显示的
            // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 1500),
            // 是否显示
            show: options.show === undefined ? true : options.show
        }
    });
    
    
    pin._node = this
    this.CesiumObj = pin
    this.viewer = options.earth._viewer
    this.data = options.data || null
    this.changeStatus = options.changeStatus === undefined ? true : options.changeStatus

    if (options.aniInit) {
        this.timerFun(options)
    }
}

DrawCesiumImg.prototype.timerFun = function (options) {
    let CesiumObj = this.CesiumObj
    let index = 0
    let speed = 40
    let that = this
    let pixelOffset = options.pixelOffset || [ 0, 0, 0 ]

    ani()

    function ani () {
        that.timer = requestAnimationFrame(() => {
            index++
            CesiumObj.billboard.pixelOffset = new Cesium.Cartesian3(pixelOffset[0], pixelOffset[1] - speed + index, pixelOffset[2])
            CesiumObj.billboard.color = Cesium.Color.WHITE.withAlpha(1 * (index / speed))
            if (index < speed) {
                ani()
            } else {
                cancelAnimationFrame(that.timer)
            }
        })
    }
},

DrawCesiumImg.prototype.update = function (options) {
    if (!this.changeStatus) {
        return
    }
    for (let k in options) {
        if (k == 'position') {
            this.CesiumObj.position = Cesium.Cartesian3.fromDegrees(options[k][0], options[k][1], options[k][2] ? 0 : options[k][2])
        } else {
            this.CesiumObj.billboard[k] = options[k]
        }
    }
}

DrawCesiumImg.prototype.click = function () {
    if (this.onclick) { this.onclick() }
}


DrawCesiumImg.prototype.destroy = function () {
    if (this.timer) {
        cancelAnimationFrame(this.timer)
    }
    this.viewer.entities.remove(this.CesiumObj)
}

DrawCesiumImg.prototype.setShow = function (options) {
    this.CesiumObj.billboard.show = options
}

export default DrawCesiumImg